package com.jn.erp.wechat.staff.handler;

import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
import cn.binarywang.wx.miniapp.util.WxMaConfigHolder;
import com.alibaba.fastjson2.JSONObject;
import com.google.common.collect.ImmutableMap;
import me.chanjar.weixin.common.error.WxErrorException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * <pre>
 *  小程序信息相关
 * </pre>
 *
 * @author sunjiyong
 * @since 2024/9/25 14:05
 */
//@AllArgsConstructor
@Component
public class MiniappInfoHandler {

    private final WxMaService wxMaService;

    @Autowired
    public MiniappInfoHandler(@Qualifier("teacherWxMaService") WxMaService wxMaService){
        this.wxMaService = wxMaService;
    }

    //access_token 是小程序全局唯一后台接口调用凭据，调用绝大多数后台接口时都需使用。开发者可以通过 getAccessToken 接口获取并进行妥善保存。
    public String getAccessToken() {
        String accessToken = "";
        try {
            accessToken = wxMaService.getAccessToken();
        } catch (WxErrorException e) {
            System.out.println(e.getError());
        }
        return accessToken;
    }

    //登录凭证校验。通过 wx.login 接口获得临时登录凭证 code 后传到开发者服务器调用此接口完成登录流程。
    public WxMaJscode2SessionResult jsCode2SessionInfo(String code) {
        try {
            WxMaJscode2SessionResult wxMaJscode2SessionResult = wxMaService.jsCode2SessionInfo(code);
            WxMaConfigHolder.remove();//清理ThreadLocal
            return wxMaJscode2SessionResult;
        } catch (WxErrorException e) {
            System.out.println(e.getError());
            return null;
        }

    }


    //该接口用于将code换取用户手机号。 说明，每个code只能使用一次，code的有效期为5min。
    public JSONObject getPhoneNumber(String code) {
        try {
            Map<String, String> params = ImmutableMap.of("code", code);
            String post = wxMaService.post("https://api.weixin.qq.com/wxa/business/getuserphonenumber", WxMaGsonBuilder.create().toJson(params));
            JSONObject info = JSONObject.parseObject(post);
            WxMaConfigHolder.remove();//清理ThreadLocal
            return info;
        } catch (WxErrorException e) {
            System.out.println(e.getError());
            return null;
        }

    }

}
